home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / Report Writers / Crystal Repot 9.0 Full CD version / Setup.exe / Tools / Developers / PEDELF32.ZIP / pedelf32 / MAIN.~PA < prev    next >
Encoding:
Text File  |  2002-04-19  |  18.0 KB  |  586 lines

  1. {Delphi Print Engine Sample Application
  2.  Created by Andre B. Couturier
  3.  
  4.  Modifications:
  5.  September 24, 1998 - Trevor Dubinsky
  6.  
  7.  Recompiled to use the new header file CRDelphi.Pas
  8.  Recompiled 16 bit version in Delphi 2 to make 16&32 bit closer together
  9.  
  10.  September 30, 1998 - Trevor Dubinsky
  11.  
  12.  Added a form Setloc, to demonstrate how to set the location of native tables
  13.  at run-time.  Also demonstrates how to pass a username and password for Paradox
  14.  and Access tables at runtime.
  15.  
  16.  This new form does not yet perform error checking for the calls.  To be added
  17.  later. There is also a invalid pointer operation error with the setformula
  18.  form.  This happens when the form is opened, and is inconsistent.
  19.  
  20.  Look on our website at www.seagatesoftware.com/crystalreports/updates in the
  21.  Delphi section for future updates to this application.
  22.  }
  23. unit Main;
  24.  
  25. interface
  26.  
  27. uses
  28.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  29.   Forms, Dialogs, Menus, Buttons, ExtCtrls, Logon, Display, Prntopt, Printers,
  30.   StdCtrls, Location, Section, Formula, About, CRDelphi, SetLoc;
  31.  
  32. type
  33.   TMainForm = class(TForm)
  34.     OpenReportDialog: TOpenDialog;
  35.     MainMenu: TMainMenu;
  36.     MnuiFile: TMenuItem;
  37.     MnuExit: TMenuItem;
  38.     MnuEngine: TMenuItem;
  39.     MnuOpenEngine: TMenuItem;
  40.     MnuCloseEngine: TMenuItem;
  41.     MnuReport: TMenuItem;
  42.     MnuOpenReport: TMenuItem;
  43.     MnuCloseReport: TMenuItem;
  44.     MnuDestination: TMenuItem;
  45.     MnuToWindow: TMenuItem;
  46.     MnuToPrinter: TMenuItem;
  47.     MnuToFile: TMenuItem;
  48.     MnuPrint: TMenuItem;
  49.     MnuPrintNow: TMenuItem;
  50.     MnuSqlOptions: TMenuItem;
  51.     MnuGetInfo: TMenuItem;
  52.     PnlMain: TPanel;
  53.     MnuShowSQLQuery: TMenuItem;
  54.     MnuFormatting: TMenuItem;
  55.     MnuGetRepTitle: TMenuItem;
  56.     MnuClosePreview: TMenuItem;
  57.     MnuDiscard: TMenuItem;
  58.     MnuGetPrintOptions: TMenuItem;
  59.     MnuGetSelectedPrinter: TMenuItem;
  60.     MnuSelectPrinter: TMenuItem;
  61.     MnuTestConnectivity: TMenuItem;
  62.     SetPrinterDialog: TPrintDialog;
  63.     MnuLocation: TMenuItem;
  64.     MnuGetLocation: TMenuItem;
  65.     MnuGetSectionMin: TMenuItem;
  66.     MnuSetSectionMin: TMenuItem;
  67.     MnuLogOn: TMenuItem;
  68.     MnuLogOff: TMenuItem;
  69.     PnlStatus: TPanel;
  70.     Label1: TLabel;
  71.     Label2: TLabel;
  72.     PnlDestination: TPanel;
  73.     MnuFormulas: TMenuItem;
  74.     MnuSelection: TMenuItem;
  75.     MnuHelp: TMenuItem;
  76.     MnuAbout: TMenuItem;
  77.     MnuGroup: TMenuItem;
  78.     MnuAllFormulas: TMenuItem;
  79.     MnuCallsMade: TMenuItem;
  80.     N1: TMenuItem;
  81.     N2: TMenuItem;
  82.     N3: TMenuItem;
  83.     N4: TMenuItem;
  84.     N5: TMenuItem;
  85.     N6: TMenuItem;
  86.     N7: TMenuItem;
  87.     N8: TMenuItem;
  88.     N9: TMenuItem;
  89.     N10: TMenuItem;
  90.     N11: TMenuItem;
  91.     N12: TMenuItem;
  92.     N13: TMenuItem;
  93.     N14: TMenuItem;
  94.     SetTableLocations1: TMenuItem;
  95.     procedure MnuExitClick(Sender: TObject);
  96.     procedure MnuOpenEngineClick(Sender: TObject);
  97.     procedure MnuCloseEngineClick(Sender: TObject);
  98.     procedure MnuOpenReportClick(Sender: TObject);
  99.     procedure MnuCloseReportClick(Sender: TObject);
  100.     procedure MnuToWindowClick(Sender: TObject);
  101.     procedure MnuPrintNowClick(Sender: TObject);
  102.     procedure MnuToPrinterClick(Sender: TObject);
  103.     procedure MnuGetInfoClick(Sender: TObject);
  104.     procedure MnuShowSQLQueryClick(Sender: TObject);
  105.     procedure MnuGetRepTitleClick(Sender: TObject);
  106.     procedure MnuClosePreviewClick(Sender: TObject);
  107.     procedure MnuDiscardClick(Sender: TObject);
  108.     procedure MnuGetPrintOptionsClick(Sender: TObject);
  109.     procedure MnuGetSelectedPrinterClick(Sender: TObject);
  110.     procedure MnuSelectPrinterClick(Sender: TObject);
  111.     procedure MnuTestConnectivityClick(Sender: TObject);
  112.     procedure MnuGetLocationClick(Sender: TObject);
  113.     procedure MnuGetSectionMinClick(Sender: TObject);
  114.     procedure MnuSetSectionMinClick(Sender: TObject);
  115.     procedure FormResize(Sender: TObject);
  116.     procedure MnuLogOnClick(Sender: TObject);
  117.     procedure MnuLogOffClick(Sender: TObject);
  118.     function  GetError(Const JobIn : smallint) : String;
  119.     procedure MnuSelectionClick(Sender: TObject);
  120.     procedure MnuAboutClick(Sender: TObject);
  121.     procedure MnuGroupClick(Sender: TObject);
  122.     procedure MnuAllFormulasClick(Sender: TObject);
  123.     procedure MnuCallsMadeClick(Sender: TObject);
  124.     procedure SetTableLocations1Click(Sender: TObject);
  125.   private
  126.     { Private declarations }
  127.   public
  128.     { Public declarations }
  129.  
  130.   end;
  131.  
  132. const
  133.   Selection = 1;
  134.   Group = 2;
  135.   Formulas = 3;
  136.  
  137. var
  138.   MainForm: TMainForm;
  139.   LogInInfo : PELogOnInfo;  {Structure for the SQl logon parameters}
  140.   JobNumber : smallint;      {Global Job number for use by CRPE}
  141.   DrvHandle, PrntHandle, PortHandle : hWnd;
  142.   DrvLength, PrntLength, PortLength : smallint;
  143.   DrvText, PrntText, PortText : PChar;
  144.   Mode : PDevMode;
  145.   SenderIsGet : Bool;    {Global Variables for using forms with multiple purposes}
  146.   SenderIsLogOn : Bool;
  147.   FormulaSender : smallint;
  148.   FileNme : PChar;  {Report Name - was temp in openreport but I need global now}
  149.  
  150. implementation
  151.  
  152. {$R *.DFM}
  153.  
  154. function TMainForm.GetError(Const JobIn : smallint) : String;
  155. {This is my print engine error message capture function. It accepts
  156.  the job number as it parameter and then gets the error code and
  157.  message text and then passes this back out as a formatted string}
  158. var
  159.   Code : smallint;
  160.   StrHandle : hWnd;
  161.   Buffer : PChar;
  162.   Length : smallint;
  163.   Ret : Bool;
  164.  
  165. begin
  166.    Code := PEGetErrorCode(JobIn); {Get the Error code from the Crpe}
  167.    Ret := PEGetErrorText(JobIn, StrHandle, Length);  {Get the error message handle}
  168.  
  169.    Buffer := StrAlloc(Length);
  170.    {get the text from the text handle}
  171.    Ret := PEGetHandleString(StrHandle, Buffer, Length);
  172.  
  173.    GetError := IntToStr(Code) + ' - ' + StrPas(Buffer); {output the string}
  174.    StrDispose(Buffer);
  175. end;
  176.  
  177. procedure TMainForm.MnuExitClick(Sender: TObject);
  178. begin
  179.   Application.Terminate;
  180. end;
  181.  
  182. procedure TMainForm.MnuOpenEngineClick(Sender: TObject);
  183. begin
  184.    If PEOpenEngine then    {Open the Crystal Print Engine}
  185.      begin
  186.        { Update the status bar}
  187.        PnlStatus.Caption := 'Print Engine is Open';
  188.  
  189.        {Set the menu options}
  190.        MnuCloseEngine.Enabled := True;
  191.        MnuOpenEngine.Enabled := False;
  192.        MnuExit.Enabled := False;
  193.        MnuOpenReport.Enabled := True;
  194.        MnuReport.Enabled := True;
  195.      end
  196.    else
  197.        ShowMessage('Print Engine Not Opened');
  198. end;
  199.  
  200. procedure TMainForm.MnuCloseEngineClick(Sender: TObject);
  201. begin
  202.     PECloseEngine;  {Close the Crystal Print Engine}
  203.  
  204.     {Update the status bar}
  205.     PnlStatus.Caption := 'Print Engine is Closed';
  206.  
  207.     {Menu management}
  208.     MnuReport.Enabled := False;
  209.     MnuCloseEngine.Enabled := False;
  210.     MnuPrint.Enabled := False;
  211.     PnlDestination.Caption := 'None';
  212.     MnuPrintNow.Enabled := False;
  213.     MnuSqlOptions.Enabled := False;
  214.     MnuDestination.Enabled := False;
  215.     MnuFormatting.Enabled := False;
  216.     MnuOpenEngine.Enabled := True;
  217.     MnuExit.Enabled := True;
  218.     MnuFormulas.Enabled := False;
  219.     MnuLocation.Enabled := False;
  220.     MnuShowSQLQuery.Enabled := False;
  221.     MnuLogOff.Enabled := False;
  222. end;
  223.  
  224. procedure TMainForm.MnuOpenReportClick(Sender: TObject);
  225. var
  226.  
  227.   
  228.   TableType : PETableType;  {Temp variable used in determining the type of report}
  229.   Ret : Bool;      {Temp Variable used to store returned values from the Crpe}
  230.  
  231. begin
  232.    If OpenReportDialog.Execute then   {get the report file name}
  233.       begin
  234.  
  235.          {Open the Report and assign the Job number}
  236.          JobNumber := PEOpenPrintJob(pchar(OpenReportDialog.Filename));
  237.  
  238.          {if the open fails give an error message}
  239.          if JobNumber = 0 then
  240.             ShowMessage(GetError(JobNumber));
  241.  
  242.  
  243.          {update the status bar}
  244.          PnlStatus.Caption := OpenReportDialog.FileName + ' is Open';
  245.  
  246.          {menu management}
  247.          MnuCloseReport.Enabled := True;
  248.          MnuOpenReport.Enabled := False;
  249.          MnuPrint.Enabled := True;
  250.  
  251.          {this block of code checks to see what type of database the report is
  252.           using and enables the SQL menu options if the report is using
  253.           Sql databases. }
  254.          TableType.Structsize := PE_SIZEOF_TABLE_TYPE;
  255.          Ret := PEGetNthTableType(JobNumber, 0, TableType);
  256.          If TableType.DBType = PE_DT_SQL then
  257.             MnuSqlOptions.Enabled := True;
  258.  
  259.          MnuDestination.Enabled := True;
  260.          MnuFormatting.Enabled := True;
  261.          MnuFormulas.Enabled := True;
  262.          MnuLocation.Enabled := True;
  263.  
  264.       end
  265.    else
  266.       ShowMessage(GetError(JobNumber)); {show any error messages}
  267. end;
  268.  
  269. procedure TMainForm.MnuCloseReportClick(Sender: TObject);
  270. begin
  271.     if PEClosePrintJob(JobNumber) then  {Close the Print job (report)}
  272.        begin
  273.           {update the status bar}
  274.           PnlStatus.Caption := 'No Open Reports';
  275.  
  276.           {Menu management}
  277.           MnuOpenReport.Enabled := True;
  278.           MnuCloseReport.Enabled := False;
  279.           MnuCloseEngine.Enabled := True;
  280.           MnuPrint.Enabled := False;
  281.           PnlDestination.Caption := 'None';
  282.           MnuPrintNow.Enabled := False;
  283.           MnuSqlOptions.Enabled := False;
  284.           MnuDestination.Enabled := False;
  285.           MnuFormatting.Enabled := False;
  286.           MnuFormulas.Enabled := False;
  287.           MnuLocation.Enabled := False;
  288.           MnuShowSQLQuery.Enabled := False;
  289.        end
  290.     else
  291.        ShowMessage(GetError(JobNumber));  {show any error messages}
  292. end;
  293.  
  294. procedure TMainForm.MnuToWindowClick(Sender: TObject);
  295.  
  296. begin
  297.    {Set the Destination of the report to Window, and the position size etc}
  298.    if PEOutputToWindow(JobNumber,'Delphi PE Application',30,30,600,400,0,0) then
  299.      begin
  300.        PnlDestination.Caption := 'Window';
  301.        MnuPrint.Enabled := True;
  302.        MnuPrintNow.Enabled := True;
  303.      end
  304.    else
  305.       ShowMessage(GetError(JobNumber));  {show any error messages}
  306.  
  307. end;
  308.  
  309. procedure TMainForm.MnuPrintNowClick(Sender: TObject);
  310.  
  311. begin
  312.    {begin executing the print job, sending it to whatever destination is selected}
  313.    if PEStartPrintJob(JobNumber, True) = False then
  314.       ShowMessage(GetError(JobNumber))  {show any error messages}
  315.    else
  316.       MnuClosePreview.Enabled := True;
  317. end;
  318.  
  319. procedure TMainForm.MnuToPrinterClick(Sender: TObject);
  320.  
  321. begin
  322.    {set the output destination to printer}
  323.    if PEOutputToPrinter(JobNumber,0) then
  324.      begin
  325.        PnlDestination.Caption := 'Printer';  {update the status bar}
  326.  
  327.        {menu management}
  328.        MnuPrintNow.Enabled := True;
  329.        MnuPrint.Enabled := True;
  330.      end
  331.    else
  332.      ShowMessage(GetError(JobNumber));  {show any error messages}
  333.  
  334. end;
  335.  
  336. procedure TMainForm.MnuGetInfoClick(Sender: TObject);
  337.  
  338. begin
  339.    {Look on the OnShow event of LogOnForm for the Calls for this menu option}
  340.    LogOnForm.ShowModal;
  341.    MnuShowSQLQuery.Enabled := True;
  342. end;
  343.  
  344. procedure TMainForm.MnuShowSQLQueryClick(Sender: TObject);
  345. var
  346.    Ret : Bool;
  347.    TxtHandle : Hwnd;
  348.    TxtLength : smallint;
  349.    TxtBuffer : PChar;
  350.  
  351. begin
  352.    {get the Sql Query out of the report}
  353.    if PEGetSqlQuery(JobNumber, TxtHandle, TxtLength) = False then
  354.       ShowMessage(GetError(JobNumber))   {show any error messages}
  355.    else
  356.       begin
  357.          TxtBuffer := StrAlloc(TxtLength);  {allocate memory for the PChar}
  358.  
  359.          {Get the actual text in a usable form}
  360.          if PEGetHandleString(TxtHandle, TxtBuffer, TxtLength) = False then
  361.             ShowMessage(GetError(JobNumber))   {show any error messages}
  362.          else
  363.             begin
  364.                {set up and display the Sql query on a text output form}
  365.                TxtForm.LblDisplay.Caption := StrPas(TxtBuffer);
  366.                TxtForm.Caption := 'SQL Query';
  367.                TxtForm.ShowModal
  368.             end;
  369.          StrDispose(TxtBuffer);
  370.       end;
  371.  
  372. end;
  373.  
  374. procedure TMainForm.MnuGetRepTitleClick(Sender: TObject);
  375. var
  376.    Ret : Bool;
  377.    TxtHandle : Hwnd;
  378.    TxtLength : smallint;
  379.    TxtBuffer : PChar;
  380.  
  381. begin
  382.    {Get the title of the Report from the report}
  383.    if PEGetReportTitle(JobNumber, TxtHandle, TxtLength) then
  384.       begin
  385.          TxtBuffer := StrAlloc(TxtLength);
  386.          {Get the text of the report name}
  387.          if PEGetHandleString(TxtHandle, TxtBuffer, TxtLength) then
  388.             begin
  389.                {set up form and display report title on my text form}
  390.                TxtForm.LblDisplay.Caption := StrPas(TxtBuffer);
  391.                TxtForm.Caption := 'Report Title';
  392.                TxtForm.ShowModal
  393.             end
  394.          else
  395.             ShowMessage(GetError(JobNumber));   {show any error messages}
  396.          StrDispose(TxtBuffer);
  397.       end
  398.    else
  399.       ShowMessage('This report has no Report Title')   {show any error messages}
  400. end;
  401.  
  402. procedure TMainForm.MnuClosePreviewClick(Sender: TObject);
  403.  
  404. begin
  405.    PeCloseWindow(JobNumber); {Close the Preview Window}
  406.    MnuClosePreview.Enabled := False;
  407. end;
  408.  
  409. procedure TMainForm.MnuDiscardClick(Sender: TObject);
  410. Var
  411.    Ret : Bool;  {Temporary Variable}
  412.  
  413. begin
  414.    if PEDiscardSavedData(JobNumber) then
  415.       ShowMessage('Data has been discarded')
  416.    else
  417.       ShowMessage(GetError(JobNumber));  {show any error messages}
  418. end;
  419.  
  420. procedure TMainForm.MnuGetPrintOptionsClick(Sender: TObject);
  421. begin
  422.    {Look in the OnShow event for this form to see the CRPE calls}
  423.    FrmPrintOptions.ShowModal;
  424. end;
  425.  
  426. procedure TMainForm.MnuGetSelectedPrinterClick(Sender: TObject);
  427. var
  428.    Ret : Bool;
  429. begin
  430.    {Get the selected printer from the report, only returns a printer if
  431.     a specific printer was set. Returns null if no specific printer was set}
  432.    if PEGetSelectedPrinter(JobNumber, DrvHandle, DrvLength, PrntHandle, PrntLength, PortHandle, PortLength, Mode) then
  433.       begin
  434.          DrvText := StrAlloc(DrvLength);
  435.          Ret := PEGetHandleString(DrvHandle, DrvText, DrvLength);    {Get the Driver Name}
  436.          PrntText := StrAlloc(PrntLength);
  437.          Ret := PEGetHandleString(PrntHandle, PrntText, PrntLength); {Get the Printer Name}
  438.          PortText := StrAlloc(PortLength);
  439.          Ret := PEGetHandleString(PortHandle, PortText, PortLength); {Get the Port Name}
  440.  
  441.          {Set up and display the text form}
  442.          TxtForm.LblDisplay.Caption := 'Driver : ' + StrPas(DrvText) + Chr(10) + Chr(13);
  443.          TxtForm.LblDisplay.Caption := TxtForm.LblDisplay.Caption + 'Printer : ' + StrPas(PrntText) + Chr(10) + Chr(13);
  444.          TxtForm.LblDisplay.Caption := TxtForm.LblDisplay.Caption + 'Port : ' + StrPas(PortText) + Chr(10) + Chr(13);
  445.          TxtForm.Caption := 'Selected Printer';
  446.  
  447.          StrDispose(DrvText);
  448.          StrDispose(PrntText);
  449.          StrDispose(PortText);
  450.  
  451.          TxtForm.ShowModal;
  452.       end
  453.    else
  454.       ShowMessage(GetError(JobNumber));
  455. end;
  456.  
  457. procedure TMainForm.MnuSelectPrinterClick(Sender: TObject);
  458. var
  459.    Devmode :  THandle;
  460.  
  461.  
  462. begin
  463.    {Prompt the user select a new printer}
  464.   if SetPrinterDialog.Execute then
  465.    begin
  466.    {Grab the selected printer information from the PRINTER object}
  467.    DrvText := StrAlloc(255);
  468.    PrntText := StrAlloc(255);
  469.    PortText := StrAlloc(255);
  470.    Printer.GetPrinter(PrntText, DrvText, PortText, Devmode);
  471.  
  472.    {Tell the CRPE to use the printer selected above}
  473.    if PESelectPrinter(JobNumber, DrvText, PrntText, PortText, PDevMode(Devmode)) then
  474.       begin
  475.          {Set up and display the text form}
  476.          TxtForm.LblDisplay.Caption := (StrPas(DrvText) + ' ' + StrPas(PrntText) + ' ' + StrPas(PortText));
  477.          TxtForm.Caption := 'Selected Printer';
  478.          TxtForm.ShowModal
  479.       end
  480.    else
  481.       ShowMessage(GetError(JobNumber));   {show any error messages}
  482.  
  483.    StrDispose(DrvText);
  484.    StrDispose(PrntText);
  485.    StrDispose(PortText);
  486.   end
  487. end;
  488.  
  489. procedure TMainForm.MnuTestConnectivityClick(Sender: TObject);
  490.  
  491. begin
  492.    {Test if the server for this report is available (logged on)}
  493.    If PETestNthTableConnectivity(JobNumber, 0) then
  494.       Showmessage('Connected')
  495.    else
  496.       ShowMessage(GetError(JobNumber));    {show any error messages}
  497.  
  498.  
  499. end;
  500.  
  501. procedure TMainForm.MnuGetLocationClick(Sender: TObject);
  502. begin
  503.    {Look in the OnShow event for the related PE calls}
  504.    FrmLocation.ShowModal;
  505. end;
  506.  
  507. procedure TMainForm.MnuGetSectionMinClick(Sender: TObject);
  508.  
  509. begin
  510.    {used in the Section form to differentiate between calling menu options}
  511.    SenderIsGet := True;
  512.    {Look in the OnShow Event in this form for the PEGetMinimumSection Height}
  513.    FrmSection.ShowModal;
  514. end;
  515.  
  516. procedure TMainForm.MnuSetSectionMinClick(Sender: TObject);
  517.  
  518. begin
  519. {Look in the OnShow Event in this form for the PEGetMinimumSection Height}
  520. FrmSection.ShowModal;
  521. end;
  522.  
  523.  
  524. procedure TMainForm.FormResize(Sender: TObject);
  525. begin
  526.    {Reposition the Status bar when a change is made to the main form}
  527.    PnlMain.Top :=  (MainForm.ClientHeight - (PnlMain.Height));
  528.    PnlMain.Width := MainForm.Width - 8;  
  529. end;
  530.  
  531. procedure TMainForm.MnuLogOnClick(Sender: TObject);
  532. begin
  533.    {Used to differentiate between call menu options}
  534.    SenderIsLogOn := True;
  535.    {Look in the Onshow event for this form for realted PE calls}
  536.    LogOnForm.ShowModal;
  537.    MnuShowSQLQuery.Enabled := True;
  538.    MnuLogOff.Enabled := True;
  539. end;
  540.  
  541.  
  542. procedure TMainForm.MnuLogOffClick(Sender: TObject);
  543.  
  544. begin
  545.    {Log off the specified ODBC datasource}
  546.    if PELogOffServer('PDSODBC.DLL', LogInInfo) = False then
  547.       ShowMessage(GetError(JobNumber));  {show any error messages}
  548.    MnuLogOff.Enabled := False;
  549. end;
  550.  
  551. procedure TMainForm.MnuSelectionClick(Sender: TObject);
  552. begin
  553.    FormulaSender := Selection;
  554.    FrmFormulas.Showmodal;
  555. end;
  556.  
  557. procedure TMainForm.MnuAboutClick(Sender: TObject);
  558. begin
  559.    AboutBox.ShowModal;
  560. end;
  561.  
  562. procedure TMainForm.MnuGroupClick(Sender: TObject);
  563. begin
  564.    FormulaSender := Group;
  565.    FrmFormulas.Showmodal;
  566. end;
  567.  
  568. procedure TMainForm.MnuAllFormulasClick(Sender: TObject);
  569. begin
  570.    FormulaSender := Formulas;
  571.    FrmFormulas.Showmodal;
  572. end;
  573.  
  574. procedure TMainForm.MnuCallsMadeClick(Sender: TObject);
  575. begin
  576.   Application.HelpFile := 'PROPRTYS.HLP';
  577.   Application.HelpCommand(HELP_CONTENTS, 0);
  578. end;
  579.  
  580. procedure TMainForm.SetTableLocations1Click(Sender: TObject);
  581. begin
  582.    FrmSetLoc.ShowModal;
  583. end;
  584.  
  585. end.
  586.